gdk: Implement GInitable on GdkDisplayManager
authorThomas Wood <thomas.wood@intel.com>
Fri, 22 Feb 2013 16:41:12 +0000 (16:41 +0000)
committerMatthias Clasen <mclasen@redhat.com>
Sat, 23 Mar 2013 02:23:39 +0000 (22:23 -0400)
Add GInitable interface with a default implementation that always
succeeds. This allows backends to override the GInitable implementation
and add their own checks to determine if the backend can be loaded.  If
a backend cannot be loaded, GDK can attempt to load the next available
backend.

Since backends may need to read any relevant options (such as the
display flag) to determine if they can be created successfully, this
patch also removes calls that attempt to create the display manager
before the options have been parsed.

https://bugzilla.gnome.org/show_bug.cgi?id=694465

gdk/gdk.c
gdk/gdkdisplaymanager.c

index 437ecf99d0cd8446505bf380a4a2ed294e90b940..5d0dc1ce397051797bd8dca64cd617e5cf1ed286 100644 (file)
--- a/gdk/gdk.c
+++ b/gdk/gdk.c
@@ -275,9 +275,6 @@ gdk_pre_parse_libgtk_only (void)
       else if (g_str_equal (rendering_mode, "recording"))
         _gdk_rendering_mode = GDK_RENDERING_MODE_RECORDING;
     }
-
-  /* Do any setup particular to the windowing system */
-  gdk_display_manager_get ();
 }
 
   
index 0a0ee8574494fc08e8ecf4f1f17a4c331a1eb42a..f4706112e823279e08354959c113762d323c2786 100644 (file)
@@ -125,7 +125,24 @@ static void gdk_display_manager_get_property (GObject                *object,
 
 static guint signals[LAST_SIGNAL] = { 0 };
 
-G_DEFINE_TYPE (GdkDisplayManager, gdk_display_manager, G_TYPE_OBJECT)
+static void g_initable_iface_init (GInitableIface *iface);
+
+G_DEFINE_TYPE_WITH_CODE (GdkDisplayManager, gdk_display_manager, G_TYPE_OBJECT,
+                         G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE, g_initable_iface_init))
+
+static gboolean
+gdk_display_manager_initable_init (GInitable     *initable,
+                                   GCancellable  *cancellable,
+                                   GError       **error)
+{
+  return TRUE;
+}
+
+static void
+g_initable_iface_init (GInitableIface *iface)
+{
+  iface->init = gdk_display_manager_initable_init;
+}
 
 static void
 gdk_display_manager_class_init (GdkDisplayManagerClass *klass)
@@ -236,33 +253,31 @@ gdk_display_manager_get (void)
       backend = g_getenv ("GDK_BACKEND");
 #ifdef GDK_WINDOWING_QUARTZ
       if (backend == NULL || strcmp (backend, "quartz") == 0)
-        manager = g_object_new (gdk_quartz_display_manager_get_type (), NULL);
-      else
+        manager = g_initable_new (gdk_quartz_display_manager_get_type (), NULL, NULL, NULL);
 #endif
 #ifdef GDK_WINDOWING_WIN32
-      if (backend == NULL || strcmp (backend, "win32") == 0)
-        manager = g_object_new (gdk_win32_display_manager_get_type (), NULL);
-      else
+      if (!manager && (backend == NULL || strcmp (backend, "win32") == 0))
+        manager = g_initable_new (gdk_win32_display_manager_get_type (), NULL, NULL, NULL);
 #endif
 #ifdef GDK_WINDOWING_X11
-      if (backend == NULL || strcmp (backend, "x11") == 0)
-        manager = g_object_new (gdk_x11_display_manager_get_type (), NULL);
-      else
+      if (!manager && (backend == NULL || strcmp (backend, "x11") == 0))
+        manager = g_initable_new (gdk_x11_display_manager_get_type (), NULL, NULL, NULL);
 #endif
 #ifdef GDK_WINDOWING_WAYLAND
-      if (backend == NULL || strcmp (backend, "wayland") == 0)
-        manager = g_object_new (gdk_wayland_display_manager_get_type (), NULL);
-      else
+      if (!manager && (backend == NULL || strcmp (backend, "wayland") == 0))
+        manager = g_initable_new (gdk_wayland_display_manager_get_type (), NULL, NULL, NULL);
 #endif
 #ifdef GDK_WINDOWING_BROADWAY
-      if (backend == NULL || strcmp (backend, "broadway") == 0)
-        manager = g_object_new (gdk_broadway_display_manager_get_type (), NULL);
-      else
+      if (!manager && (backend == NULL || strcmp (backend, "broadway") == 0))
+        manager = g_initable_new (gdk_broadway_display_manager_get_type (), NULL, NULL, NULL);
 #endif
-      if (backend != NULL)
-        g_error ("Unsupported GDK backend: %s", backend);
-      else
-        g_error ("No GDK backend found");
+      if (!manager)
+        {
+          if (backend != NULL)
+            g_error ("Unsupported GDK backend: %s", backend);
+          else
+            g_error ("No GDK backend found");
+        }
     }
 
   return manager;